package com.tyc.c08;


import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * 学习 scope 类型
 *     singleton： 单例
 *     prototype： 多例，每次从容器中获取时创建
 *     request：每次发送请求创建
 *     session：一次会话中保持不变（浏览器定期检查（1分钟），超时销毁（无访问）。配置：server.servlet.session.timeout（配置的值小于60则1分钟销毁））
 *     application：同一个web应用程旭
 */
@SpringBootApplication
public class C08Application {
    private static final Logger log = LoggerFactory.getLogger(C08Application.class);

    public static void main(String[] args) {

        ConfigurableApplicationContext context = SpringApplication.run(C08Application.class, args);
        /**
         * 在一个单例bean中注入scope 类型非单例的会失效，每次获取的还是同一个对象
         * 因为对于单例对象 Autowired 只注入了一次
         */
        Single single = context.getBean(Single.class);
        System.out.println(single.getT1() == single.getT1());
        // 解决方案1 lazy注解，注入的为代理对象，调用对象方法时，从容器获取对象，执行对象方法
        System.out.println("方法1：");
        log.info("==========> lazy代理解决 <==========");
        log.info("代理对象类型：{}",single.getT2().getClass());
        log.info("实际对象：{}",single.getT2().toString());
        log.info("实际对象：{}",single.getT2().toString());
        log.info("==========> lazy代理解决 <==========");
        System.out.println("方法2：");
        log.info("==========> proxyMode = ScopedProxyMode.TARGET_CLASS <==========");
        log.info("代理对象类型：{}",single.getT3().getClass());
        log.info("实际对象：{}",single.getT3().toString());
        log.info("实际对象：{}",single.getT3().toString());
        log.info("==========> proxyMode = ScopedProxyMode.TARGET_CLASS <==========");
        System.out.println("方法3：");
        log.info("==========> ObjectFactory<T4> <==========");
        log.info("实际对象：{}",single.getT4().toString());
        log.info("实际对象：{}",single.getT4().toString());
        log.info("==========> proxyMode = ScopedProxyMode.TARGET_CLASS <==========");
        System.out.println("方法4：");
        log.info("==========> 从applicationContext获取 <==========");
        log.info("实际对象：{}",single.getT5().toString());
        log.info("实际对象：{}",single.getT5().toString());
        log.info("==========> proxyMode = ScopedProxyMode.TARGET_CLASS <==========");

    }
}
